home *** CD-ROM | disk | FTP | other *** search
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- NNNNAAAAMMMMEEEE
- CCCCCCCCFFFFFFFFTTTT, ZZZZZZZZFFFFFFFFTTTT - Applies a complex-to-complex Fast Fourier Transform (FFT)
-
- SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
- Single precision complex -> Single precision complex
-
- Fortran:
- CCCCAAAALLLLLLLL CCCCCCCCFFFFFFFFTTTT ((((_i_s_i_g_n,,,, _n,,,, _s_c_a_l_e,,,, _x,,,, _y,,,, _t_a_b_l_e,,,, _w_o_r_k,,,, _i_s_y_s))))
-
- C/C++:
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt ccccccccfffffffftttt ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n,,,, ffffllllooooaaaatttt _s_c_a_l_e,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_x,,,,
- ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_y,,,, ffffllllooooaaaatttt *_t_a_b_l_e,,,, ffffllllooooaaaatttt *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- C++ STL:
- ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>>
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt ccccccccfffffffftttt ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n,,,, ffffllllooooaaaatttt _s_c_a_l_e,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_x,,,,
- ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_y,,,, ffffllllooooaaaatttt *_t_a_b_l_e,,,, ffffllllooooaaaatttt *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- Double precision complex -> Double precision complex
-
- Fortran:
- CCCCAAAALLLLLLLL ZZZZZZZZFFFFFFFFTTTT ((((_i_s_i_g_n,,,, _n,,,, _s_c_a_l_e,,,, _x,,,, _y,,,, _t_a_b_l_e,,,, _w_o_r_k,,,, _i_s_y_s))))
-
- C/C++:
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt zzzzzzzzfffffffftttt ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n,,,, ddddoooouuuubbbblllleeee _s_c_a_l_e,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_x,,,,
- ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_y,,,, ddddoooouuuubbbblllleeee *_t_a_b_l_e,,,, ddddoooouuuubbbblllleeee *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- C++ STL:
- ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>>
- ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>>
- iiiinnnntttt zzzzzzzzfffffffftttt ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n,,,, ddddoooouuuubbbblllleeee _s_c_a_l_e,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_x,,,,
- ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_y,,,, ddddoooouuuubbbblllleeee *_t_a_b_l_e,,,, ddddoooouuuubbbblllleeee *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;;
-
- IIIIMMMMPPPPLLLLEEEEMMMMEEEENNNNTTTTAAAATTTTIIIIOOOONNNN
- These routines are part of the SCSL Scientific Library and can be loaded
- using either the ----llllssssccccssss or the ----llllssssccccssss____mmmmpppp option. The ----llllssssccccssss____mmmmpppp option
- directs the linker to use the multi-processor version of the library.
-
- When linking to SCSL with ----llllssssccccssss or ----llllssssccccssss____mmmmpppp, the default integer size is
- 4 bytes (32 bits). Another version of SCSL is available in which integers
- are 8 bytes (64 bits). This version allows the user access to larger
- memory sizes and helps when porting legacy Cray codes. It can be loaded
- by using the ----llllssssccccssss____iiii8888 option or the ----llllssssccccssss____iiii8888____mmmmpppp option. A program may use
- only one of the two versions; 4-byte integer and 8-byte integer library
- calls cannot be mixed.
-
- The C and C++ prototypes shown above are appropriate for the 4-byte
- integer version of SCSL. When using the 8-byte integer version, the
- variables of type iiiinnnntttt become lllloooonnnngggg lllloooonnnngggg and the <<<<ssssccccssssllll____fffffffftttt____iiii8888....hhhh>>>> header
-
-
-
- PPPPaaaaggggeeee 1111
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- file should be included.
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- These routines compute the Fast Fourier Transform (FFT) of the complex
- vector _x, and store the result in vector _y.
-
- In FFT applications, it is customary to use zero-based subscripts; the
- formulas are simpler that way. Suppose that the arrays are declared as
- follows:
-
- Fortran:
-
- COMPLEX X(0:N-1), Y(0:N-1)
-
-
- C/C++:
-
- scsl_complex x[n], y[n];
-
-
- C++ STL:
-
- complex<float> x[n], y[n];
-
-
- The output array is the FFT of the input array, using the following
- formula for the FFT:
-
-
-
- n-1 isign * j * k
- Y k = scale * Sum [X * w ]
- k j=0 j
-
-
- for _k = 0 ..., _n-1 where:
-
- _w = exp(2*_p_i*_i/_n),
-
- _i = + sqrt(-1),
-
- _p_i = 3.14159...
-
- _i_s_i_g_n = +1 or -1
-
- Different authors use different conventions for which of the transforms,
- _i_s_i_g_n = +1 or _i_s_i_g_n = -1, is the forward or inverse transform, and what
- the scale factor should be in either case. You can make this routine
- compute any of the various possible definitions, however, by choosing the
- appropriate values for _i_s_i_g_n and _s_c_a_l_e.
-
-
-
-
-
- PPPPaaaaggggeeee 2222
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- The relevant fact from FFT theory is this: If you take the FFT with any
- particular values of _i_s_i_g_n and _s_c_a_l_e, the mathematical inverse function
- is computed by taking the FFT with -_i_s_i_g_n and nnnn 1111////((((_n*_s_c_a_l_e). In
- particular, if you use _i_s_i_g_n = +1 and _s_c_a_l_e = 1.0 you can compute the
- inverse FFT by using _i_s_i_g_n = -1 and _s_c_a_l_e = 1.0/_n.
-
- The output array may be the same as the input array.
-
- See the NOTES section of this man page for information about the
- interpretation of the data types described in the following arguments.
-
- These routines have the following arguments:
-
- _i_s_i_g_n Integer. (input)
- Specifies whether to initialize the table array or to do the
- forward or inverse Fourier transform, as follows:
-
- If _i_s_i_g_n = 0, the routine initializes the _t_a_b_l_e array and
- returns. In this case, the only arguments used or checked are
- _i_s_i_g_n, _n, and _t_a_b_l_e.
-
- If _i_s_i_g_n = +1 or -1, the value of _i_s_i_g_n is the sign of the
- exponent used in the FFT formula.
-
- _n Integer. (input)
- Size of the transform (the number of values in the input
- array). _n >= 0.
-
- _s_c_a_l_e Scale factor. (input).
- CCCCCCCCFFFFFFFFTTTT: Single precision.
- ZZZZZZZZFFFFFFFFTTTT: Double precision.
- Each element of the output array is multiplied by _s_c_a_l_e after
- taking the Fourier transform, as defined by the previous
- formula.
-
- _x Array of size _n. (input)
- CCCCCCCCFFFFFFFFTTTT: Single precision complex array.
- ZZZZZZZZFFFFFFFFTTTT: Double precision complex array.
-
- Input array of values to be transformed.
-
- _y Array of size _n. (output)
- CCCCCCCCFFFFFFFFTTTT: Single precision complex array.
- ZZZZZZZZFFFFFFFFTTTT: Double precision complex array.
- Output array of transformed values. The output array may be
- the same as the input array. In that case, the transform is
- done in place and the input array is overwritten with the
- transformed values.
-
- _t_a_b_l_e Array of size (2*_n + _N_F) (input or output)
- CCCCCCCCFFFFFFFFTTTT: Single precision array.
- ZZZZZZZZFFFFFFFFTTTT: Double precision array.
-
-
-
- PPPPaaaaggggeeee 3333
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- Table of factors and roots of unity. See the description of
- the _i_s_y_s argument for the value of _N_F.
-
- If _i_s_i_g_n = 0, the routine initializes _t_a_b_l_e (_t_a_b_l_e is output
- only).
-
- If _i_s_i_g_n = +1 or -1, the values in _t_a_b_l_e are assumed to be
- initialized already by a prior call with _i_s_i_g_n = 0 (_t_a_b_l_e is
- input only).
-
- _w_o_r_k Array of size (2 * _n).
- CCCCCCCCFFFFFFFFTTTT: Single precision array.
- ZZZZZZZZFFFFFFFFTTTT: Double precision array.
-
- Work array. This is a scratch array used for intermediate
- calculations. Its address space must be different address
- space from that of the input and output arrays.
-
- _i_s_y_s Integer array dimensioned 0000........_i_s_y_s((((0000))))
- An array that gives implementation-specific information. All
- features and functions of the FFT routines specific to any
- particular implementation are confined to this _i_s_y_s array.
-
- In the Origin series implementation, _i_s_y_s((((0000))))====0000 and _i_s_y_s((((0000))))====1111
- are supported. In SCSL versions prior to 1.3, only _i_s_y_s((((0000))))====0000
- was allowed. For _i_s_y_s((((0000))))====0000, _N_F====33330000, and for _i_s_y_s((((0000))))====1111, _N_F====222255556666.
- The _N_F words of storage in the _t_a_b_l_e array contain a
- factorization of the length of the transform.
-
- The smaller value of _N_F for _i_s_y_s((((0000))))====0000 is historical. It is too
- small to store all the required factors for the highest
- performing FFT, so when _i_s_y_s((((0000))))====0000, extra space is allocated
- when the _t_a_b_l_e array is initialized. To avoid memory leaks,
- this extra space must be deallocated when the _t_a_b_l_e array is no
- longer needed. The CCCCCCCCFFFFFFFFTTTTFFFF routine is used to release this
- memory. Due to the potential for memory leaks, the use of
- _i_s_y_s((((0000))))====0000 should be avoided.
-
- For _i_s_y_s((((0000))))====1111, the value of _N_F is large enough so that no extra
- memory needs to be allocated, and there is no need to call
- CCCCCCCCFFFFFFFFTTTTFFFF to release memory. If called, it does nothing.
-
- NOTE: _i_s_y_s((((0000))))====1111 means that _i_s_y_s is an integer array with two
- elements. The second element, _i_s_y_s((((1111)))), will not be accessed.
-
- NNNNOOOOTTTTEEEESSSS
- The following data types are described in this documentation:
-
- TTTTeeeerrrrmmmm UUUUsssseeeedddd DDDDaaaattttaaaa ttttyyyyppppeeee
-
-
-
-
-
-
- PPPPaaaaggggeeee 4444
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- Fortran:
-
- Array dimensioned _n xxxx((((nnnn))))
-
- Array of dimensions (_m,_n) xxxx((((mmmm,,,,nnnn))))
-
- Integer IIIINNNNTTTTEEEEGGGGEEEERRRR (IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]])
-
- Single precision RRRREEEEAAAALLLL
-
- Double precision DDDDOOOOUUUUBBBBLLLLEEEE PPPPRRRREEEECCCCIIIISSSSIIIIOOOONNNN
-
- Single precision complex CCCCOOOOMMMMPPPPLLLLEEEEXXXX
-
- Double precision complex DDDDOOOOUUUUBBBBLLLLEEEE CCCCOOOOMMMMPPPPLLLLEEEEXXXX
-
- C/C++:
-
- Array dimensioned _n xxxx[[[[_n]]]]
-
- Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]]
-
- Integer iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]])
-
- Single precision ffffllllooooaaaatttt
-
- Double precision ddddoooouuuubbbblllleeee
-
- Single precision complex ssssccccssssllll____ccccoooommmmpppplllleeeexxxx
-
- Double precision complex ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx
-
- C++ STL:
-
- Array dimensioned _n xxxx[[[[_n]]]]
-
- Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]]
-
- Integer iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]])
-
- Single precision ffffllllooooaaaatttt
-
- Double precision ddddoooouuuubbbblllleeee
-
- Single precision complex ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>>
-
- Double precision complex ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>>
-
- CCCCAAAAUUUUTTTTIIIIOOOONNNNSSSS
- Transform sizes with a prime factor exceeding 22223332222----1111 are not supported for
- the 8-byte integer version of the library.
-
-
-
-
- PPPPaaaaggggeeee 5555
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- In addition to the _w_o_r_k array, the FFT routines also dynamically allocate
- scratch space from the stack. The amount of space allocated can be
- slightly bigger than the size of the largest processor cache. For single
- processor runs, the default stack size is large enough that these
- allocations generally cause no problems. But for parallel runs, you need
- to ensure that the stack size of slave threads is big enough to hold this
- scratch space. Failure to reserve sufficient stack space will cause
- programs to dump core due to stack overflows. The stack size of MP
- library slave threads is controlled via the MMMMPPPP____SSSSLLLLAAAAVVVVEEEE____SSSSTTTTAAAACCCCKKKKSSSSIIIIZZZZEEEE
- environment variable or the mmmmpppp____sssseeeetttt____ssssllllaaaavvvveeee____ssssttttaaaacccckkkkssssiiiizzzzeeee(((()))) library routine. See
- the mmmmpppp(3C), mmmmpppp(3F) and ppppeeee____eeeennnnvvvviiiirrrroooonnnn(5) reference pages for more information
- on controlling the slave stack size. For pthreads applications, the
- thread's stack size is specified as one of many creation attributes
- provided in the pthread_attr_t argument to pppptttthhhhrrrreeeeaaaadddd____ccccrrrreeeeaaaatttteeee(3P). The
- stacksize attribute should be set explicitly to a non-default value using
- the pppptttthhhhrrrreeeeaaaadddd____aaaattttttttrrrr____sssseeeettttssssttttaaaacccckkkkssssiiiizzzzeeee(3P) call, described in the
- pppptttthhhhrrrreeeeaaaadddd____aaaattttttttrrrr____iiiinnnniiiitttt(3P) man page.
-
- Care must be exercised if copies of the _t_a_b_l_e array are used: even though
- a copy exists, the original must persist. As an example, the following
- code will nnnnooootttt work:
-
- #include <scsl_fft.h>
- scsl_complex x[1024], y[1024];
- float table[2048+256];
- float work[2048];
- int isys[2];
- isys[0] = 1;
- {
- float table_orig[2048+256];
-
- ccfft(0, 1024, 1.0f, x, y, table_orig, work, isys);
- bcopy(table_orig, table, (2048+256)*sizeof(float));
- }
- ccfft(1, 1024, 1.0f, x, y, table, work, isys);
-
-
- In this example, because _t_a_b_l_e__o_r_i_g is a stack variable that does not
- persist outside of the code block delimited by the braces, the data in
- the copy, _t_a_b_l_e, are not guaranteed to be valid. However, the following
- code will work because _t_a_b_l_e__o_r_i_g is persistent:
-
- #include <scsl_fft.h>
- scsl_complex x[1024], y[1024];
- float table_orig[2048+256], table[2048+256];
- float work[2048];
- int isys[2];
- isys[0] = 1;
- ccfft(0, 1024, 1.0f, x, y, table_orig, work, isys);
- bcopy(table_orig, table, (2048+256)*sizeof(float));
- ccfft(1, 1024, 1.0f, x, y, table, work, isys);
-
-
-
-
- PPPPaaaaggggeeee 6666
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- EEEEXXXXAAAAMMMMPPPPLLLLEEEESSSS
- These examples use the table and workspace sizes appropriate to the
- Origin series.
-
- Example 1: Initialize the _t_a_b_l_e array in preparation for doing an FFT of
- size 1024. Only the _i_s_i_g_n, _n, and _t_a_b_l_e arguments are used in this case.
- You can use dummy arguments or zeros for the other arguments in the
- subroutine call.
-
- Fortran:
-
- REAL TABLE(2048+256)
- INTEGER ISYS(0:1)
- ISYS(0) = 1
- CALL CCFFT(0, 1024, 0.0, DUMMY, DUMMY, TABLE, DUMMY, ISYS)
-
-
- C/C++:
-
- #include <scsl_fft.h>
- float table[2048+256];
- int isys[2];
- isys[0] = 1;
- ccfft(0, 1024, 0.0f, NULL, NULL, table, NULL, isys);
-
-
- C++ STL:
-
- #include <complex.h>
- #include <scsl_fft.h>
- float table[2048+256];
- int isys[2];
- isys[0] = 1;
- ccfft(0, 1024, 0.0f, NULL, NULL, table, NULL, isys);
-
-
- Example 2: _x and _y are complex arrays of dimension (0:1023). Take the
- FFT of _x and store the results in _y. Before taking the FFT, initialize
- the _t_a_b_l_e array, as in example 1.
-
- Fortran:
-
- COMPLEX X(0:1023), Y(0:1023)
- REAL TABLE(2048+256)
- REAL WORK(2048)
- INTEGER ISYS(0:1)
- ISYS(0) = 1
- CALL CCFFT(0, 1024, 1.0, X, Y, TABLE, WORK, ISYS)
- CALL CCFFT(1, 1024, 1.0, X, Y, TABLE, WORK, ISYS)
-
-
-
-
-
-
- PPPPaaaaggggeeee 7777
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- C/C++:
-
- #include <scsl_fft.h>
- scsl_complex x[1024], y[1024];
- float table[2048+256];
- float work[2048];
- int isys[2];
- isys[0] = 1;
- ccfft(0, 1024, 1.0f, x, y, table, work, isys);
- ccfft(1, 1024, 1.0f, x, y, table, work, isys);
-
-
- C++ STL:
-
- #include <complex.h>
- #include <scsl_fft.h>
- complex<float> x[1024], y[1024];
- float table[2048+256];
- float work[2048];
- int isys[2];
- isys[0] = 1;
- ccfft(0, 1024, 1.0f, x, y, table, work, isys);
- ccfft(1, 1024, 1.0f, x, y, table, work, isys);
-
-
- Example 3: Using the same _x and _y as in example 2, take the inverse FFT
- of _y and store it back in _x. The scale factor 1/1024 is used. Assume
- that the _t_a_b_l_e array is already initialized.
-
- Fortran:
-
- CALL CCFFT(-1, 1024, 1.0/1024.0, Y, X, TABLE, WORK, ISYS)
-
-
- C/C++ and C++ STL:
-
- ccfft(-1, 1024, 1.0f/1024.0f, y, x, table, work, isys);
-
-
- Example 4: Perform the same computation as in example 2, but put the
- output back in array _x to save storage space. Use the 8-byte integer
- version of SCSL.
-
- Fortran:
-
- COMPLEX X(0:1023)
- REAL TABLE(2048+256)
- REAL WORK(2048)
- INTEGER*8 ISYS(0:1)
- ISYS(0) = 1_8
- CALL CCFFT(0_8, 1024_8, 1.0, X, X, TABLE, WORK, ISYS)
- CALL CCFFT(1_8, 1024_8, 1.0, X, X, TABLE, WORK, ISYS)
-
-
-
- PPPPaaaaggggeeee 8888
-
-
-
-
-
-
- CCCCCCCCFFFFFFFFTTTT((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT((((3333SSSS))))
-
-
-
- C/C++:
-
- #include <scsl_fft_i8.h>
- scsl_complex x[1024]
- float table[2048+256];
- float work[2048];
- long long isys[2];
- isys[0] = 1LL;
- ccfft(0LL, 1024LL, 1.0f, x, x, table, work, isys);
- ccfft(1LL, 1024LL, 1.0f, x, x, table, work, isys);
-
-
- C++ STL:
-
- #include <complex.h>
- #include <scsl_fft_i8.h>
- complex<float> x[1024]
- float table[2048+256];
- float work[2048];
- long long isys[2];
- isys[0] = 1LL;
- ccfft(0LL, 1024LL, 1.0f, x, x, table, work, isys);
- ccfft(1LL, 1024LL, 1.0f, x, x, table, work, isys);
-
-
- Example 5: Perform the same computation as in example 2, but assume that
- the lower bound of each Fortran array is 1, rather than 0. No change is
- needed in the subroutine calls:
-
- Fortran:
-
- COMPLEX X(1024), Y(1024)
- CALL CCFFT(0, 1024, 1.0, X, Y, TABLE, WORK, ISYS)
- CALL CCFFT(1, 1024, 1.0, X, Y, TABLE, WORK, ISYS)
-
-
- SSSSEEEEEEEE AAAALLLLSSSSOOOO
- IIIINNNNTTTTRRRROOOO____FFFFFFFFTTTT(3S), IIIINNNNTTTTRRRROOOO____SSSSCCCCSSSSLLLL(3S), CCCCCCCCFFFFFFFFTTTTMMMM(3S), SSSSCCCCFFFFFFFFTTTT(3S), SSSSCCCCFFFFFFFFTTTTMMMM(3S)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PPPPaaaaggggeeee 9999
-
-
-
-
-
-
-